// 待找bug

#include <bits/stdc++.h>
using namespace std;

const int MOD = 1000000007; // 模数
const int MAXN = 200010;    // 最大数据范围

// 指令结构体：存储指令类型和区间参数
struct Command {
  char type; // 指令类型：'+' 或 '*'
  int l, r;  // 指令操作的区间[l, r]
};

int n, m;                          // n:单元格数, m:指令数
Command cmd[MAXN];                 // 存储所有指令
int cmdTree[MAXN], cellTree[MAXN]; // 两个树状数组：指令树和单元格树

// 计算x的二进制表示中最低位的1所对应的值
// 例如：lowbit(6) = lowbit(0b110) = 0b10 = 2
// 这是树状数组的核心操作，用于快速定位需要更新的节点
inline int lowbit(int x) { return x & -x; }

// 树状数组更新操作
// 树状数组更新函数
// 参数说明：
//   tree[]: 待更新的树状数组
//   idx: 需要更新的起始位置(1-based索引)
//   delta: 要增加/减少的值
//   size: 树状数组的总大小
void update(int tree[], int idx, int delta, int size) {
  // 循环更新从idx开始的所有相关父节点
  while (idx <= size) {
    // 更新当前节点的值，并对MOD取模防止溢出
    tree[idx] = (tree[idx] + delta) % MOD;
    // 通过lowbit计算找到下一个需要更新的父节点位置
    // lowbit(idx)获取idx二进制表示中最低位的1对应的值
    idx += lowbit(idx);
  }
}

// 树状数组查询操作（前缀和）
// 树状数组查询函数（前缀和查询）
// 参数说明：
//   tree[]: 要查询的树状数组
//   idx: 查询的终止位置(1-based索引)
// 返回值: 前idx个元素的和（模MOD）

// 查询时通过前缀和得到单点值
int query(int tree[], int idx) {
  int sum = 0;
  while (idx > 0) {
    sum = (sum + tree[idx]) % MOD;
    idx -= lowbit(idx);
  }
  return sum;
}

int main() {
  // 输入数据
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    cin >> cmd[i].type >> cmd[i].l >> cmd[i].r;
  }

  // 第一步：统计每条指令的执行次数
  update(cmdTree, m, 1, m); // 初始化最后一条指令执行1次
  int times[MAXN] = {0};    // 存储每条指令的执行次数

  // 倒序处理指令，计算执行次数
  for (int i = m; i >= 1; i--) {
    times[i] = query(cmdTree, i); // 查询当前指令的执行次数
    if (cmd[i].type == '*') {     // 如果是重复指令
      // 将被重复的指令区间的执行次数增加times[i]次
      update(cmdTree, cmd[i].l, times[i], m);
      update(cmdTree, cmd[i].r + 1, -times[i], m);
    }
  }

  // 第二步：计算每个单元格的最终值
  for (int i = 1; i <= m; i++) {
    if (cmd[i].type == '+') { // 如果是加法指令
      // 在区间[l,r]上每个单元格加times[i]次
      // 区间[l,r]的加法操作转化为两个单点更新
      update(cellTree, cmd[i].l, times[i], n);      // 左端点加times[i]
      update(cellTree, cmd[i].r + 1, -times[i], n); // 右端点+1减times[i]
    }
  }

  // 第三步：输出每个单元格的最终值
  for (int i = 1; i <= n; i++) {
    cout << query(cellTree, i) << endl; // 查询单元格i的值
  }

  return 0;
}
